<?php

class Tortilla {
	public $vars = array();
	
	private $base_dir = '';
	
	//==========================================================================================
	
	function __construct($base_dir = '') {
		$this->base_dir = $base_dir;
	}
	
	//==========================================================================================
	
	public function Assign($key, $value) {
		$this->vars[$key] = $value;
	}
	
	//==========================================================================================
	
	public function Display($path) {
		global $G;

		foreach ($this->vars as $__name => $__value) {
			$$__name = $__value;
		}

		include $this->base_dir.DIRECTORY_SEPARATOR.$path;
	}
	
	//==========================================================================================
	
	public function Fetch($path) {
		ob_start();
		$this->Display($path);
		return ob_get_clean();
	}
	
	//==========================================================================================
	
	public function truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false) {
		if ($length == 0)
	        return '';
	
	    if (strlen($string) > $length) {
	        $length -= min($length, strlen($etc));
	        if (!$break_words && !$middle) {
	            $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
	        }
	        if(!$middle) {
	            return substr($string, 0, $length) . $etc;
	        } else {
	            return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
	        }
	    } else {
	        return $string;
	    }
	}
	
	//==========================================================================================
	
	public function escape($string, $esc_type = 'html', $char_set = 'ISO-8859-1') {
		switch ($esc_type) {
	        case 'html':
	            return htmlspecialchars($string, ENT_QUOTES, $char_set);
	
	        case 'htmlall':
	            return htmlentities($string, ENT_QUOTES, $char_set);
	
	        case 'url':
	            return rawurlencode($string);
	
	        case 'urlpathinfo':
	            return str_replace('%2F','/',rawurlencode($string));
	            
	        case 'quotes':
	            // escape unescaped single quotes
	            return preg_replace("%(?<!\\\\)'%", "\\'", $string);
	
	        case 'hex':
	            // escape every character into hex
	            $return = '';
	            for ($x=0; $x < strlen($string); $x++) {
	                $return .= '%' . bin2hex($string[$x]);
	            }
	            return $return;
	            
	        case 'hexentity':
	            $return = '';
	            for ($x=0; $x < strlen($string); $x++) {
	                $return .= '&#x' . bin2hex($string[$x]) . ';';
	            }
	            return $return;
	
	        case 'decentity':
	            $return = '';
	            for ($x=0; $x < strlen($string); $x++) {
	                $return .= '&#' . ord($string[$x]) . ';';
	            }
	            return $return;
	
	        case 'javascript':
	            // escape quotes and backslashes, newlines, etc.
	            return strtr($string, array('\\'=>'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n','</'=>'<\/'));
	            
	        case 'mail':
	            // safe way to display e-mail address on a web page
	            return str_replace(array('@', '.'),array(' [AT] ', ' [DOT] '), $string);
	            
	        case 'nonstd':
	           // escape non-standard chars, such as ms document quotes
	           $_res = '';
	           for($_i = 0, $_len = strlen($string); $_i < $_len; $_i++) {
	               $_ord = ord(substr($string, $_i, 1));
	               // non-standard char, escape it
	               if($_ord >= 126){
	                   $_res .= '&#' . $_ord . ';';
	               }
	               else {
	                   $_res .= substr($string, $_i, 1);
	               }
	           }
	           return $_res;
	
	        default:
	            return $string;
	    }
	}
}

?>